using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web;
using C3.Directory.Services;
using CSI.Directory.Core.Model;
using CSI.Directory.Core.Repositories;
using CSI.Directory.Core.Services;
using log4net;

//https://developer.authorize.net/guides/AIM/

namespace CSI.Directory.Services
{
    public class TransactionService: ServiceBase, ITransactionService
    {
        private static readonly ILog Log = LogManager.GetLogger(typeof(TransactionService));

        public TransactionService(ISessionService sessionService, IUserRepository userRepo, IDirectoryRepository directoryRepository) : base(sessionService, userRepo, directoryRepository)
        {
        }

        public TransactionResult ProcessPayment(int userid, string cc, string ccexp, string amount,
                                                string firstname, string lastname, string address, string city, string state, string zipcode, string phone)
        {
            var t = new TransactionResult(){Successful = false};
            try{
                
                // By default, this sample code is designed to post to our test server for
                // developer accounts: https://test.authorize.net/gateway/transact.dll
                // for real accounts (even in test mode), please make sure that you are
                // posting to: https://secure.authorize.net/gateway/transact.dll
                //String post_url = "https://test.authorize.net/gateway/transact.dll";
                String post_url = "https://secure.authorize.net/gateway/transact.dll";

                Dictionary<string, string> post_values = new Dictionary<string, string>();
                //the API Login ID and Transaction Key must be replaced with valid values
                post_values.Add("x_login", "986YEsdk48vV");
                post_values.Add("x_tran_key", "9CP38Vsk4m98vD7K");
                post_values.Add("x_delim_data", "TRUE");
                post_values.Add("x_delim_char", "|");
                post_values.Add("x_relay_response", "FALSE");

                post_values.Add("x_type", "AUTH_CAPTURE");
                post_values.Add("x_method", "CC");
                //post_values.Add("x_card_num", "4111111111111111");
                post_values.Add("x_card_num", cc);
                post_values.Add("x_exp_date", ccexp);

                post_values.Add("x_amount", amount);
                post_values.Add("x_description", "EF Listing Package");

                post_values.Add("x_first_name", firstname);
                post_values.Add("x_last_name", lastname);
                post_values.Add("x_address", address);
                post_values.Add("x_city", city);
                post_values.Add("x_state", state);
                post_values.Add("x_zip", zipcode);
                // Additional fields can be added here as outlined in the AIM integration
                // guide at: http://developer.authorize.net

                // This section takes the input fields and converts them to the proper format
                // for an http post.  For example: "x_login=username&x_tran_key=a1B2c3D4"
                String post_string = "";

                foreach (KeyValuePair<string, string> post_value in post_values)
                {
                    post_string += post_value.Key + "=" + HttpUtility.UrlEncode(post_value.Value) + "&";
                }
                post_string = post_string.TrimEnd('&');

                // The following section provides an example of how to add line item details to
                // the post string.  Because line items may consist of multiple values with the
                // same key/name, they cannot be simply added into the above array.
                //
                // This section is commented out by default.
                /*
                string[] line_items = {
                    "item1<|>golf balls<|><|>2<|>18.95<|>Y",
                    "item2<|>golf bag<|>Wilson golf carry bag, red<|>1<|>39.99<|>Y",
                    "item3<|>book<|>Golf for Dummies<|>1<|>21.99<|>Y"};
	
                foreach( string value in line_items )
                {
                    post_string += "&x_line_item=" + HttpUtility.UrlEncode(value);
                }
                */

                // create an HttpWebRequest object to communicate with Authorize.net
                HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(post_url);
                objRequest.Method = "POST";
                objRequest.ContentLength = post_string.Length;
                objRequest.ContentType = "application/x-www-form-urlencoded";

                // post data is sent as a stream
                StreamWriter myWriter = null;
                myWriter = new StreamWriter(objRequest.GetRequestStream());
                myWriter.Write(post_string);
                myWriter.Close();

                // returned values are returned as a stream, then read into a string
                String post_response;
                HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
                using (StreamReader responseStream = new StreamReader(objResponse.GetResponseStream()))
                {
                    post_response = responseStream.ReadToEnd();
                    responseStream.Close();
                }
                Log.Info(post_response);
                // the response string is broken into an array
                // The split character specified here must match the delimiting character specified above
                var responseArray = post_response.Split('|');
                if (responseArray.Length <= 0 || Int32.Parse(responseArray[0]) != 1)
                {
                    t.Exception = responseArray[3].ToString();
                    
                }else
                {
                    t.Successful = true;
                }
                // the results are output to the screen in the form of an html numbered list.

                
                // individual elements of the array could be accessed to read certain response
                // fields.  For example, response_array[0] would return the Response Code,
                // response_array[2] would return the Response Reason Code.
                // for a list of response fields, please review the AIM Implementation Guide
                
                return t;

            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                t.Successful = false;
                t.Exception = ex.Message;
                return t;
            }
        }

        public void CreateCRMRecord()
        {
            
            
        }

  }
}